package com.hljcj.boot.service;

import com.hljcj.boot.bean.SysDepart;
import com.hljcj.boot.dao.DepartDao;
import com.hljcj.boot.dao.DepartRepository;
import org.springframework.data.domain.*;
import org.springframework.data.domain.ExampleMatcher.GenericPropertyMatchers;
import org.springframework.data.domain.ExampleMatcher.StringMatcher;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.transaction.Transactional;
import java.util.List;

@Service
@Transactional
public class DepartService {

    @Resource
    private DepartRepository departRepository;

    @Resource
    private DepartDao departDao;

    // 根据名字查询
    public List<SysDepart> findByDepartName(String departName) {
        return departRepository.findByDepartName(departName);
    }

    // 根据名字模糊查询
    public SysDepart findByDepartNameLike(String DepartName) {
        return departRepository.findByDepartNameLike(DepartName);
    }

    // AND
    public Page<SysDepart> queryDepart(int pageNo, int pageSize) {
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
        Page<SysDepart> ls = departRepository.findAll(pageable);
        return ls;
    }

    // or
    public List<SysDepart> findByDepartNameOrDepartCharge(SysDepart sysDepart) {
        ExampleMatcher matcher = ExampleMatcher.matching() // 构建对象
                .withStringMatcher(StringMatcher.CONTAINING) // 改变默认字符串匹配方式：模糊查询
                .withIgnoreCase(true) // 改变默认大小写忽略方式：忽略大小写
                .withMatcher("departName", GenericPropertyMatchers.startsWith()) // 职务名称采用“开始匹配”的方式查询
                .withMatcher("departCharge", GenericPropertyMatchers.startsWith()) // 职务名称采用“开始匹配”的方式查询
                .withIgnorePaths("departId"); // 忽略属性： postId是主键 不参与查询
        // 创建实例
        Example<SysDepart> ex = Example.of(sysDepart, matcher);
        List<SysDepart> ls = departRepository.findAll(ex);
        return ls;
    }

    // is.equals
    public List<SysDepart> findByDepartId(int DepartId) {
        return departRepository.findByDepartId(DepartId);
    }

    // Between
    public List<SysDepart> findByDepartIdBetween(Integer DepartId, Integer DepartId2) {
        List<SysDepart> lSysDeparts = departRepository.findByDepartIdBetween(DepartId, DepartId2);
        return lSysDeparts;
    }

    // LessThan
    public List<SysDepart> findByDepartIdLessThan(int Id) {
        return departRepository.findByDepartIdLessThan(Id);
    }

    // LessThanequal
    public List<SysDepart> findByDepartIdLessThanEqual(int Id) {
        return departRepository.findByDepartIdLessThanEqual(Id);
    }

    // Graterthan
    public List<SysDepart> findByDepartIdGraterThan(Integer DepartId) {
        return departRepository.findByDepartIdGreaterThan(DepartId);
    }

    // GraterthanEqual
    public List<SysDepart> findByDepartIdGraterThanEqual(Integer DepartId) {
        return departRepository.findByDepartIdGreaterThanEqual(DepartId);
    }

    // after
    public List<SysDepart> findByDepartIdAfter(Integer DepartId) {
        return departRepository.findByDepartIdAfter(DepartId);
    }

    // before
    public List<SysDepart> findByDepartIdBefore(Integer DepartId) {
        return departRepository.findByDepartIdBefore(DepartId);
    }

    // isnull
    public List<SysDepart> findByDepartIdIsNull() {
        return departRepository.findByDepartIdIsNull();
    }

    // notnull
    public List<SysDepart> findByDepartIdNotNull() {
        return departRepository.findByDepartIdNotNull();
    }

    // notlike
    public List<SysDepart> findByDepartNameNotLike(String tmpString) {
        return departRepository.findByDepartNameNotLike(tmpString);
    }

    // StartingWith
    public List<SysDepart> findByDepartNameStartingWith(String DepartName) {
        return departRepository.findByDepartNameStartingWith(DepartName);
    }

    // EndingWith
    public List<SysDepart> findByDepartNameEndingWith(String DepartName) {
        return departRepository.findByDepartNameEndingWith(DepartName);
    }

    // Containing
    public List<SysDepart> findByDepartNameContaining(String DepartName) {
        return departRepository.findByDepartNameContaining(DepartName);
    }

    // order
    public List<SysDepart> findByDepartIdOrderByDepartCharge(Integer DepartId) {
        return departRepository.findByDepartIdOrderByDepartCharge(DepartId);
    }

    // not
    public List<SysDepart> findByDepartIdNot(Integer DepartId) {
        return departRepository.findByDepartIdNot(DepartId);
    }

    // in
    public List<SysDepart> findByDepartIdIn(List<Integer> DepartId) {
        return departRepository.findByDepartIdIn(DepartId);
    }

    // notin
    public List<SysDepart> findByDepartIdNotIn(List<Integer> DepartId) {
        return departRepository.findByDepartIdNotIn(DepartId);
    }

//    // true
//    public void findByDepartIdTrue() {
//        departRepository.findByDepartIdTrue();
//    }
//
//    // false
//    public void findByActivefalse() {
//        departRepository.findByActivefalse();
//    }

//    public SysDepart add(SysDepart sysDepart) {
//        departRepository.save(sysDepart);
//        if (null == sysDepart.getDepartAddr()) {
//            throw new java.lang.RuntimeException("人为异常");
//        }
//        departRepository.save(sysDepart);
//        return sysDepart;
//    }

    public Page<SysDepart> queryDepart(SysDepart sysDepart, int pageNo, int pageSize) throws Exception {
        Page<SysDepart> page = departDao.queryDepart(sysDepart, pageNo, pageSize);
        return page;
    }


    @Transactional
    public String addDepart(SysDepart depart) {
        List<SysDepart> tmp = departRepository.findByDepartName(depart.getDepartName());
        if (null == tmp || tmp.size() == 0) {
            departRepository.save(depart);
            return "succ";
        } else {
            return "部门名称：" + depart.getDepartName() + "，重复，保存失败！";
        }
    }

    @Transactional
    public String updDepart(SysDepart depart) {
        List<SysDepart> ls = departRepository.findByDepartName(depart.getDepartName());
        if (null != ls && ls.size() > 0) {
            SysDepart temp = ls.get(0);
            if (temp.getDepartId() == depart.getDepartId()) {
                departRepository.save(depart);
                return "succ";
            } else {
                return "部门名称：" + depart.getDepartName() + "，重复，保存失败！";
            }
        } else {
            departRepository.save(depart);
            return "succ";
        }
    }

    /**
     * 删除一个部门
     *
     * @param departId
     */
    @Transactional
    public void delDepart(Integer departId) {
        departRepository.deleteById(departId);
    }

}
